// sgu300
// 题意：
// 按顺序给定n(<=4000)个铁路的顶点，保证铁路与坐标轴平行，并且铁路可以相交，
// 但不能重叠，现在火车在铁轨上要保证时刻不能相撞，但允许火车头和火车尾在
// 同一个点，问火车最长可以多长。
//
// 题解：
// 一开始想了个O(n log n)的做法，二分长度然后O(n)判断，但是一直wa 6。
//
// 然后改成了判最小环长度的O(n^2)的做法，很快就ac了。
//
// run: $exec < input
#include <iostream>
#include <algorithm>

struct data { int x, y; };
int const maxn = 5000;
data da[maxn];
int sum[maxn];
int n;

int dis(data const& a, data const& b) { return abs(a.x - b.x) + abs(a.y - b.y); }
bool parallel(data const& a, data const& b) { return ((!a.x && !b.x) || (!a.y && !b.y)); }

data dir(data const& a, data const& b)
{
	if (a.x == b.x) {
		if (b.y > a.y) return {0, 1};
		else return {0, -1};
	} else {
		if (b.x > a.x) return {1, 0};
		else return {-1, 0};
	}
}

data get_inter(data const& p1, data const& p2, data const& q1)
{
	if (p1.x == p2.x) return {p1.x, q1.y};
	else return {q1.x, p1.y};
}

bool inrange(int x, int l, int r)
{
	if (l > r) std::swap(l, r);
	return (l <= x) && (x <= r);
}

bool cross(data const& p1, data const& p2, data const& q1, data const& q2)
{
	if (p1.x == p2.x) {
		if (!(inrange(q1.y, p1.y, p2.y) && inrange(p1.x, q1.x, q2.x))) return false;
	} else {
		if (!(inrange(p1.y, q1.y, q2.y) && inrange(q1.x, p1.x, p2.x))) return false;
	}
	return true;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n;
	int ans = 1 << 30;
	for (int i = 1; i <= n; i++) {
		std::cin >> da[i].x >> da[i].y;
		if (i > 1) sum[i] = sum[i - 1] + dis(da[i], da[i - 1]);
		for (int j = 1; j < i - 2; j++) {
			if (parallel(dir(da[j], da[j + 1]), dir(da[i - 1], da[i]))) continue;
			if (!cross(da[j], da[j + 1], da[i - 1], da[i])) continue;
			data inter = get_inter(da[j], da[j + 1], da[i - 1]);
			int tmp = sum[i] - sum[j] - dis(inter, da[i]) - dis(inter, da[j]);
			ans = std::min(ans, tmp);
		}
	}
	ans = std::min(ans, sum[n]);
	std::cout << ans << "\n";
}

